package lesson02;

import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class UDPEchoClient02 {

    private DatagramSocket socket;
    private String IP;
    private int port;

    public UDPEchoClient02(String IP, int port) throws SocketException {
        this.socket = new DatagramSocket();
        this.IP = IP;
        this.port = port;
    }

    public void start() throws IOException {
        System.out.println("客户端启动.");
        while (true) {
            System.out.println("->");
            Scanner scanner = new Scanner(System.in);
            String request = scanner.nextLine();
            if (request == null || request.isEmpty()) {
                System.out.println("输入的数据不能为空");
                continue;
            }
            //1.设置要使用的IP地址与端口号    为什么需要设置IP地址与端口号？？？？
            SocketAddress address = new InetSocketAddress(IP,port);
            //2、将要发送的数据打包，1.需要转成bit流，2.设置偏移量 3.设置传输数据的长度 4.传输我们设置地址与端口号
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(StandardCharsets.UTF_8),
                    0, request.getBytes().length, address);
            //3、将打包好的数据发送到服务器。    代码怎么知道我们要发送到哪个服务器上的？？
            socket.send(requestPacket);
            //4、准备好变量来接收服务器返回的数据 这个变量的设置的大小需要与服务器统一，如果设置的数据量小了就读不到完整数据，如果设置大了就浪费空间
            DatagramPacket responsePacket = new DatagramPacket(new byte[1024], 1024);
            //5、接收服务器返回的数据      服务器怎么知道要返回哪个ip地址与端口号的
            socket.receive(responsePacket);//为什么接收到数据就直接在传参的变量中直接赋值了？？？
            //6、responsePacket为输出型变量，我们使用String来解析responsePacket变量里的值
            String response = new String(responsePacket.getData(),
                    0, responsePacket.getLength(), "UTF-8");
            //7、打印出我们发送与接收到的值
            System.out.printf("request = %s  response = %s \n",request,response);
        }
    }

    public static void main(String[] args) throws IOException {
        UDPEchoClient02 udpEchoClient02 = new UDPEchoClient02("127.0.0.1",9999);
        udpEchoClient02.start();
    }
}
